///******************** NG.Respate(C)  **********************************
//* 产品名称: Respate 科技
//* 文件名称: signal.c
//* 程序作者: 雷帕特公司(南宫子萍)
//* 程序版本: V1.1														   
//* 编制日期: 2019/1/29
//* 功能描述: 系统日志
//* QQ:	2085827949
//**********************************************************************/

#include <unistd.h>
#include "stdio.h"
#include "stdlib.h"
#include "lap_lib.h"
#include "laperro.h"


#if 0
#include "signal.h"
#include <sys/types.h>

// 回收子进程
void Lap_forkChild(int sig)
{
  pid_t pid;
  int temp_errno = errno; // 保存错误号

  if(sig != SIGCHLD) goto ret;
  while( (pid = wait(NULL)) != -1);

// 恢复错误号
ret:
  errno =temp_errno;
}

static void Lap_fork()
{
  int n_fork =10;
  int num = 0;

  // 循环创建子进程
  for(num = 0;num < n_fork; num++)
    if(fork()==0) break;  // 子进程 退出循环


  if(num < n_fork)  // 子进程
  {
    printf("num:%d pid:%d\r\n",num,getpid());
    return;
  }

  if(num>=n_fork)   // 父进程
  {
    // 捕获信号 SIGCHLD回收子进程
    struct sigaction act;
    sigemptyset(&act.sa_mask);
    sigaddset(&act.sa_mask,SIGCHLD);
    act.sa_flags = 0;
    act.sa_handler = Lap_forkChild;

    // 注册回收子进程函数
    sigaction(SIGCHLD,&act,NULL);

    // 保证父进程一定能收到一个 SIGCHLD信号
    raise(SIGCHLD); 

    // 模拟其它业务逻辑
    printf("prent num:%d pid:%d\r\n",num,getpid());
    while (1);
  }
}

int main(void)
{
 Lap_fork();
}
#endif